﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Metadata.Edm;
using System.Data.SqlTypes;
using System.Data.Sql;
using System.Web.Mvc;
using PagedList;

namespace SoftHotel.Models
{

    public class AmbienteDAO : DbContext
    {

        public SqlDbType sqlDbType;
        private Conexion conexionBD = new Conexion();
        public DbSet<Ambiente> ambientes { get; set; }
        public List<Ambiente> ambientesLista = new List<Ambiente>() { };
        public List<Ambiente> busquedaAmbientes = new List<Ambiente>() { };
        public List<String> sedes;
        public List<String> tiposDeAmbiente;
        public DbSet<Parametro> Parametros { get; set; }


        public AmbienteDAO()
            : base("conexionPrincipalDAO")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Ambiente>().ToTable("Ambiente");
            modelBuilder.Entity<Sede>().ToTable("Sede");
            modelBuilder.Entity<Parametro>().ToTable("Parametro");
        }


        public string buscarTipoDeAmbiente(int idAmbiente) 
        {
            Ambiente amb = ambientes.First(a => a.idAmbiente == idAmbiente);

            Parametro par = Parametros.First(p => p.idParametro == amb.tipoAmbiente);

            return par.valor;
        }

        /*
         * Regresa todas los ambientes de tipo TIPO_DE_HABITACION disponibles.
         */
        public List<Ambiente> obtenerHabitacionesDisponibles()
        {
            /*
            IQueryable<Ambiente> ambientesLista = ambientes.Where(a => a.disponible == true);
            IQueryable<Parametro> listaParametros = Parametros.Where(p => p.tipo == "TIPO_DE_HABITACION");

            for (int i = 0; i < listaParametros.Count(); ++i)
            {
                ambientesLista = ambientesLista.Union(a => a.tipoAmbiente == listaParametros.ElementAt(i), null);
            }*/

            List<Ambiente> listaAmbientes = new List<Ambiente>() { };
            string consulta = "";

            consulta = "SELECT * FROM AMBIENTE WHERE (disponible = 1) AND (tipoAmbiente in (" +
                "SELECT idParametro from PARAMETRO WHERE (tipo = 'TIPO_DE_HABITACION')))";

            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);

             int[] x;   
             x = new int[10];
             int i = 0;

            while ((dataReader != null) && (dataReader.Read()))
            {
                Ambiente amb = new Ambiente();
                amb.idAmbiente = Convert.ToInt32(dataReader[0].ToString());
                amb.idSede = Convert.ToInt32(dataReader[1].ToString());
                amb.nombre = dataReader[2].ToString();
                amb.tipoAmbiente = Convert.ToInt32(dataReader[3].ToString());
                amb.piso = Convert.ToInt32(dataReader[4].ToString());
                amb.disponible = Convert.ToBoolean(dataReader[5].ToString());
                amb.capacidad = Convert.ToInt32(dataReader[6].ToString());
                amb.descripcion = dataReader[7].ToString();
                amb.estado = Convert.ToInt32(dataReader[8].ToString());
                listaAmbientes.Add(amb);
            }

            return listaAmbientes;
        }

        public void RegistrarAmbiente(Ambiente ambiente)
        {
            string consulta = "";

            consulta = "INSERT INTO AMBIENTE (idSede, nombre, tipoAmbiente, piso, disponible, capacidad, descripcion, estado)" +
                        "VALUES (@idSede, @nombre, @tipoAmbiente, @piso, @disponible, @capacidad, @descripcion, @estado)";

            SqlCommand command = new SqlCommand();
            conexionBD.AbrirConexion();
            command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta;

            //Se complenta atributos generados por defecto para cualquier ambiente nuevo
            ambiente.disponible = true;

            Parametro parametro = Parametros.First(p => p.tipo == "ESTADO_AMBIENTE" && p.valor == "Activo");
            ambiente.estado = parametro.idParametro;

            command.Parameters.Add("@idSede", SqlDbType.Int).Value = ambiente.idSede;
            command.Parameters.Add("@nombre", SqlDbType.VarChar, 30).Value = ambiente.nombre;
            command.Parameters.Add("@tipoAmbiente", SqlDbType.Int).Value = ambiente.tipoAmbiente;
            command.Parameters.Add("@piso", SqlDbType.Int).Value = ambiente.piso;
            command.Parameters.Add("@disponible", SqlDbType.Int).Value = ambiente.disponible;
            command.Parameters.Add("@capacidad", SqlDbType.Int).Value = ambiente.capacidad;
            command.Parameters.Add("@descripcion", SqlDbType.VarChar, 150).Value = ambiente.descripcion;
            command.Parameters.Add("@estado", SqlDbType.Int).Value = ambiente.estado;

            conexionBD.EjecutarComando2(command);
        }

        // Modifica la informacion de un ambiente
        public void ActualizarAmbiente(Ambiente ambiente)
        {
            string consulta = "";

            consulta = "UPDATE AMBIENTE SET " +
                       "nombre = @nombre, " +
                       "tipoAmbiente = @tipoAmbiente, " +
                       "piso = @piso, " +
                       "disponible = @disponible, " +
                       "capacidad = @capacidad, " +
                       "descripcion = @descripcion " +
                       "WHERE idAmbiente = @idAmbiente";

            SqlCommand command = new SqlCommand();
            conexionBD.AbrirConexion();
            command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta;

            command.Parameters.Add("@nombre", SqlDbType.VarChar, 30).Value = ambiente.nombre;
            command.Parameters.Add("@tipoAmbiente", SqlDbType.Int).Value = ambiente.tipoAmbiente;
            command.Parameters.Add("@piso", SqlDbType.Int).Value = ambiente.piso;
            command.Parameters.Add("@disponible", SqlDbType.Int).Value = ambiente.disponible;
            command.Parameters.Add("@capacidad", SqlDbType.Int).Value = ambiente.capacidad;
            command.Parameters.Add("@descripcion", SqlDbType.VarChar, 150).Value = ambiente.descripcion;
            command.Parameters.Add("@estado", SqlDbType.Int).Value = ambiente.estado;
            command.Parameters.Add("@idAmbiente", SqlDbType.Int).Value = ambiente.idAmbiente;

            conexionBD.EjecutarComando2(command);
        }

        // Actualiza un ambiente dejandolo como inactivo
        public void EliminarAmbiente(Ambiente ambiente)
        {
            string consulta = "";

            // Se valida si el ambiente esta ocupado actualmente o si existen reservas futuras
            // En estos casos no se puede dejar inactivo el ambiente
            if (!ambiente.disponible) return;

            consulta = "UPDATE AMBIENTE SET estado = @estado";

            SqlCommand command = new SqlCommand();
            conexionBD.AbrirConexion();
            command = conexionBD.connection.CreateCommand();
            //SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta;

            //Se complenta atributos generados por defecto para cualquier ambiente nuevo
            ambiente.disponible = true;
            ambiente.estado = 59;

            command.Parameters.Add("@estado", SqlDbType.Int).Value = ambiente.estado;

            conexionBD.EjecutarComando2(command);
        }

        public int buscarSede(String nombreSede)
        {
            int x = 0;
            string query = "SELECT * FROM PARAMETRO WHERE TIPO = '" + nombreSede + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
            {
                x = Int32.Parse(dr[0].ToString());
            }
            dr.Close();
            return x;
        }

        public int buscarTipoDeAmbiente(string tipoAmbiente)
        {
            int x = 0;
            string query = "SELECT * FROM PARAMETRO WHERE TIPO = '" + tipoAmbiente + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
            {
                x = Int32.Parse(dr[0].ToString());
            }
            dr.Close();
            return x;
        }

        public SelectListItem[] obtenerTipos(string tipo)
        {
            conexionBD.AbrirConexion();
            List<SelectListItem> ls = new List<SelectListItem>();
            string query = "SELECT VALOR FROM PARAMETRO WHERE TIPO = '" + tipo + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                ls.Add(new SelectListItem { Value = dr[0].ToString(), Text = dr[0].ToString() });
            }
            SelectListItem[] sls = new SelectListItem[ls.Count];
            for (int i = 0; i < ls.Count; i++)
            {
                sls[i] = ls[i];
            }
            return sls;
        }

        public List<Ambiente> buscar(Ambiente ambiente)
        {
            string consulta = "";
            AmbienteDAO consultor = new AmbienteDAO();
            //conexionBD.AbrirConexion();
            consulta = "SELECT idAmbiente, idSede, tipoAmbiente, capacidad FROM Ambiente WHERE 1=1 ";
            if (ambiente.idSede != null)
            {
                consulta += " and idSede = " + ambiente.idSede;
            }
            if (ambiente.tipoAmbiente != null)
            {
                consulta += " and descripcion LIKE '%" + ambiente.tipoAmbiente + "%'";
            }
            if (ambiente.piso != null)
            {
                consulta += " and piso = " + ambiente.piso;
            }
            if (ambiente.nombre != null)
            {
                consulta += " and nombre = " + ambiente.nombre;
            }

            SqlDataReader dr = conexionBD.EjecutarReader(consulta);
            List<Ambiente> listaAmbientes = new List<Ambiente>() { };

            while ((dr != null) && (dr.Read()))
            {
                Ambiente a = new Ambiente();

                a.idAmbiente = Int32.Parse(dr["idAmbiente"].ToString());
                a.idSede = Int32.Parse(dr["idSede"].ToString());
                a.tipoAmbiente = Int32.Parse(dr["tipoAmbiente"].ToString());
                a.capacidad = Int32.Parse(dr["capacidad"].ToString());

                listaAmbientes.Add(a);
            }

            //conexionBD.CerrarConexion();

            return listaAmbientes;
        }

        public IEnumerable<Ambiente> search_ambiente(Ambiente ambiente)
        {
            return ambientes.Where(a => a.idSede == ambiente.idSede);
        }

        public Ambiente consultar_ambiente(string id)
        {
            String consulta = "";
            consulta = "SELECT idAmbiente, idSede, nombre, tipoAmbiente, piso, disponible, capacidad, descripcion, estado FROM AMBIENTE WHERE idAmbiente = \'" + id + "\'";
            conexionBD.AbrirConexion();
            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);

            Ambiente amb = new Ambiente();
            while (dataReader != null && dataReader.Read())
            {
                amb.idAmbiente = Convert.ToInt32(dataReader[0].ToString());
                amb.idSede = Convert.ToInt32(dataReader[1].ToString());
                amb.nombre = dataReader[2].ToString();
                amb.tipoAmbiente = Convert.ToInt32(dataReader[3].ToString());
                amb.piso = Convert.ToInt32(dataReader[4].ToString());
                amb.disponible = Convert.ToBoolean(dataReader[5].ToString());
                amb.capacidad = Convert.ToInt32(dataReader[6].ToString());
                amb.descripcion = dataReader[7].ToString();
                amb.estado = Convert.ToInt32(dataReader[8].ToString());
            }

            dataReader.Close();
            conexionBD.CerrarConexion();
            return amb;
        }

    }
}